﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;

namespace GesPro
{
    /// <summary>
    /// Classe s'occupant de la gestion du classeur de projet.
    /// </summary>
    class ClasseurProjets
    {
        /// <summary>
        /// Liste de projets du classeur.
        /// </summary>
        private List<Projet> Classeur = new List<Projet>();
        /// <summary>
        /// Ajouter un projet au classeur.
        /// </summary>
        /// <param name="nom">Nom du projet</param>
        /// <param name="responsable">Responsable du projet</param>
        /// <param name="heures">Nombre d'heures de travail prévues</param>
        /// <param name="type">Type de projet</param>
        /// <param name="livraison">Date de livraison</param>
        /// <param name="description">Description du projet</param>
        /// <param name="objectifs">Objectifs du projet</param>
        public void AjouterProjet(string nom,
                                string responsable,
                                decimal heures,
                                char type,
                                string livraison,
                                string description,
                                string objectifs)
        {
            ChargerProjets();

            Projet projet = new Projet();

            projet.Nom = Crypto.EncryptStringAES(nom, AccesPreferences.ObtenirMotEncodage());
            projet.Responsable = Crypto.EncryptStringAES(responsable, AccesPreferences.ObtenirMotEncodage());
            projet.Heures = heures;
            projet.Type = type;
            projet.Date = Crypto.EncryptStringAES(livraison, AccesPreferences.ObtenirMotEncodage());
            projet.Description = Crypto.EncryptStringAES(description, AccesPreferences.ObtenirMotEncodage());
            projet.Objectifs = Crypto.EncryptStringAES(objectifs, AccesPreferences.ObtenirMotEncodage());


            Classeur.Add(projet);

            SauvegarderProjets();
  

        }

        /// <summary>
        /// Effacer un projet du classeur.
        /// </summary>
        /// <param name="nom">Nom du projet à effacer.</param>
        public void EffacerProjet(string nom)
        {
            ChargerProjets();
            for (int i = 0; i < Classeur.Count; i++)
            {

                if (Crypto.DecryptStringAES(Classeur[i].Nom, AccesPreferences.ObtenirMotEncodage()) == nom)
                {
                    Classeur.RemoveAt(i);
                }
            }
            SauvegarderProjets();  
        }
        /// <summary>
        /// Modifier un projet du classeur.
        /// </summary>
        /// <param name="nom_old">Nom du projet.</param>
        /// <param name="nom">Nouveau nom du projet.</param>
        /// <param name="responsable">Nouveau responsable de projet.</param>
        /// <param name="heures">Nouveau nombre d'heures de travail.</param>
        /// <param name="type">Nouveau type de projet.</param>
        /// <param name="date">Nouvelle date de livraison.</param>
        /// <param name="description">Nouvelle description du projet.</param>
        /// <param name="objectifs">Nouveaux objectifs du projet.</param>
        public void ModifierProjet(string nom_old, 
                                   string nom, 
                                   string responsable, 
                                   decimal heures, 
                                   char type, 
                                   string date, 
                                   string description, 
                                   string objectifs)
        {
            ChargerProjets();

            for (int i = 0; i < Classeur.Count; i++)
            {

                if (Crypto.DecryptStringAES(Classeur[i].Nom, AccesPreferences.ObtenirMotEncodage()) == nom_old)
                {
                    Classeur[i].Nom = Crypto.EncryptStringAES(nom, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Responsable = Crypto.EncryptStringAES(responsable, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Heures = heures;
                    Classeur[i].Type = type;
                    Classeur[i].Date = Crypto.EncryptStringAES(date, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Description = Crypto.EncryptStringAES(description, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Objectifs = Crypto.EncryptStringAES(objectifs, AccesPreferences.ObtenirMotEncodage());
                }
            }

            SauvegarderProjets();
   
        }

        /// <summary>
        /// Sauvegarder le classeur de projet dans le fichier correspondant.
        /// </summary>
        public void SauvegarderProjets()
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Projet>));
            using (StreamWriter writer = new StreamWriter(AccesPreferences.CheminClasseurProjets() + "\\ClasseurProjets.xml"))
            {
                xmlSerializer.Serialize(writer, Classeur);
            }
        }
        /// <summary>
        /// Charger le classeur de projet à partir du fichier correspondant.
        /// </summary>
        public void ChargerProjets()
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Projet>));
            if (!File.Exists(AccesPreferences.CheminClasseurProjets() + "\\ClasseurProjets.xml"))
            {
                using (StreamWriter writer = new StreamWriter(AccesPreferences.CheminClasseurProjets() + "\\ClasseurProjets.xml"))
                {
                    xmlSerializer.Serialize(writer, new List<Projet>() );
                }

            }

            using (StreamReader reader = new StreamReader(AccesPreferences.CheminClasseurProjets() + "\\ClasseurProjets.xml"))
            {
                Classeur = xmlSerializer.Deserialize(reader) as List<Projet>;

            }
        }
        /// <summary>
        /// Obtenir la listes des projets du classeur.
        /// </summary>
        /// <returns>Liste de projets du classeur.</returns>
        public List<Projet> ObtenirProjets()
        {
            ChargerProjets();
            foreach (Projet projet in Classeur)
            {
                projet.Nom = Crypto.DecryptStringAES(projet.Nom, AccesPreferences.ObtenirMotEncodage());
                projet.Responsable = Crypto.DecryptStringAES(projet.Responsable, AccesPreferences.ObtenirMotEncodage());
                projet.Date = Crypto.DecryptStringAES(projet.Date, AccesPreferences.ObtenirMotEncodage());
                projet.Description = Crypto.DecryptStringAES(projet.Description, AccesPreferences.ObtenirMotEncodage());
                projet.Objectifs = Crypto.DecryptStringAES(projet.Objectifs, AccesPreferences.ObtenirMotEncodage());
            }
            
            return Classeur;
        }
        /// <summary>
        /// Obtenir la fiche d'un projet en particulier.
        /// </summary>
        /// <param name="reference">Nom du projet recherché.</param>
        /// <returns>Fiche du projet voulu.</returns>
        public Projet ObtenirProjet(string reference)
        {
            Projet pro = new Projet();
            ChargerProjets();

            foreach (Projet projet in Classeur)
            {
                if (Crypto.DecryptStringAES(projet.Nom, AccesPreferences.ObtenirMotEncodage()) == reference)
                {
                    projet.Nom = Crypto.DecryptStringAES(projet.Nom, AccesPreferences.ObtenirMotEncodage());
                    projet.Responsable = Crypto.DecryptStringAES(projet.Responsable, AccesPreferences.ObtenirMotEncodage());
                    projet.Date = Crypto.DecryptStringAES(projet.Date, AccesPreferences.ObtenirMotEncodage());
                    projet.Description = Crypto.DecryptStringAES(projet.Description, AccesPreferences.ObtenirMotEncodage());
                    projet.Objectifs = Crypto.DecryptStringAES(projet.Objectifs, AccesPreferences.ObtenirMotEncodage());
                    pro = projet;
                    break;
                }

            }

            return pro;
        }

        /// <summary>
        /// Recrypter le classeur avec un nouveau mot de passe dans les préférences
        /// </summary>
        /// <param name="OldMotEncodage">Ancien mot de passe</param>
        public void RecrypterClasseur(string OldMotEncodage)
        {
            ChargerProjets();

            foreach (Projet projet in Classeur)
            {
                projet.Nom = Crypto.EncryptStringAES(Crypto.DecryptStringAES(projet.Nom, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                projet.Responsable = Crypto.EncryptStringAES(Crypto.DecryptStringAES(projet.Responsable, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                projet.Date = Crypto.EncryptStringAES(Crypto.DecryptStringAES(projet.Date, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                projet.Description = Crypto.EncryptStringAES(Crypto.DecryptStringAES(projet.Description, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                projet.Objectifs = Crypto.EncryptStringAES(Crypto.DecryptStringAES(projet.Objectifs, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());

            }
            SauvegarderProjets();
        }


    }
}
